Abstract
Con algunos de los criterios vistos en el `Laboratorio 2` como el uso de datos, el indicador técnico, el sistema de toma de pérdidas y ganancias y el dimensionamiento de posiciones, se elabora un sistema de trading automático con estudios de análisis técnico. Para encontrar los parámetros óptimos del sistema de trading se hace uso del algoritmo de enjambre de partículas. Finalmente, el sistema de trading se pone a prueba con datos fuera de la muestra.
Este laboratorio busca el desarrollo, la implementación y el testeo de un sistema de trading a través de la optimización de los criterios que lo conforman. En este caso se selecciona el activo sobre el que el sistema opera y el indicador de análisis técnico para la apertura de posiciones largas o cortas: siendo el par de divisas del euro-dólar EURUSD el activo a operar y el RSI el indicador que generará las señales. Por otra parte, los criterios a optimizar tienen que ver con la administración de las ganancias o las pérdidas (manejo del riesgo) y el tamaño o exposición de cada negociación (dimensionamiento de posiciones). A través de una búsqueda exhaustiva con los datos de entrenamiento, el algoritmo heurístico del enjambre de partículas encontrará los parámetros óptimos para el sistema de trading.
Instalar las siguientes librerías:
Archivos necesarios para correr el notebook:
import warnings
warnings.filterwarnings("ignore")
import main
En la sección actual se establece la propuesta del sistema de trading junto con los criterios que lo conforman.
Activo: Divisa euro-dólar:
EUR/USD.Temporalidad: H1.
Descarga de Precios: MetaTrader 5: Open-High-Low-Close-Volume.
Análisis: Indicador de Análisis Técnico.
Generación de Señales: RSI de 14 periodos. Explicación: Para abrir una posición larga el RSI debe encontrarse por debajo del nivel de $30$, lo que indica que el activo está sobrevendido. De lo contrario, es decir, para abrir una posición corta, el RSI debe encontrarse por arriba del nivel de $70$, lo que indica que el activo está sobrecomprado.
El Índice de Fuerza Relativa es un oscilador que indica la fuerza del precio. Matemáticamente se formula como:
$$ RSI = 100 * \frac{EMA[N] \space de \space U}{(EMA[N] \space de \space U) + (EMA[N] \space de \space D)} $$Take Profit: Búsqueda heurística de: $1-100$ pips.
Stop Loss: Búsqueda heurística: $1-100$ pips.
Lotes: Búsqueda heurística: $0.01-15$ lotes.
Como primer paso antes de la optimización del sistema de trading se cargan los datos de los precios del euro-dólar y se obtiene el indicador de análisis técnico RSI para la generación de señales de compra y de venta. Además, se deben dividir los precios en dos conjuntos, uno de entrenamiento con el que se optimizará la estrategia y uno de prueba donde se terminará por darle validación dado su desempeño. La optimización se da en las fechas: $2019/01/02$ a $2020/01/01$; mientras que la validación en las fechas: $2020/02/01$ a $2021/02/01$.
data, train, test = main.dataHandling("files/EURUSD_H1_201901020600_202102011900.csv")
data
| OPEN | HIGH | LOW | CLOSE | TICKVOL | VOL | SPREAD | RSI | |
|---|---|---|---|---|---|---|---|---|
| timestamp | ||||||||
| 2019-01-02 06:00:00 | 1.14454 | 1.14469 | 1.14427 | 1.14454 | 702 | 0 | 2 | NaN |
| 2019-01-02 07:00:00 | 1.14452 | 1.14788 | 1.14452 | 1.14787 | 1535 | 0 | 2 | NaN |
| 2019-01-02 08:00:00 | 1.14779 | 1.14967 | 1.14769 | 1.14853 | 2062 | 0 | 2 | NaN |
| 2019-01-02 09:00:00 | 1.14848 | 1.14928 | 1.14734 | 1.14761 | 4049 | 0 | 8 | NaN |
| 2019-01-02 10:00:00 | 1.14760 | 1.14776 | 1.14282 | 1.14477 | 7309 | 0 | 8 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2021-02-01 15:00:00 | 1.20756 | 1.20929 | 1.20730 | 1.20848 | 3888 | 0 | 0 | 34.676384 |
| 2021-02-01 16:00:00 | 1.20849 | 1.20992 | 1.20836 | 1.20869 | 5175 | 0 | 0 | 36.211289 |
| 2021-02-01 17:00:00 | 1.20867 | 1.20984 | 1.20799 | 1.20846 | 5155 | 0 | 0 | 35.234780 |
| 2021-02-01 18:00:00 | 1.20846 | 1.20872 | 1.20684 | 1.20686 | 3435 | 0 | 0 | 29.312807 |
| 2021-02-01 19:00:00 | 1.20687 | 1.20702 | 1.20626 | 1.20697 | 2463 | 0 | 0 | 30.181612 |
12922 rows × 8 columns
La presente sección busca optimizar el sistema de trading con ayuda del algoritmo de enjambre de partículas y para el periodo de entrenamiento.
$100,000$ USD.
PSO: Optimización por Enjambre de Partículas.
El
PSOmaximiza el capital final de la cuenta de trading.
Descripción: Pips para el cierre de ganancias.
Tipo de valor: Numérico.
Rango de valores: $1-100$ pips.
Tamaño del paso mínimo: $1$.
Descripción: Pips para el cierre de pérdidas.
Tipo de valor: Numérico.
Rango de valores: $1-100$ pips.
Tamaño del paso mínimo: $1$.
Descripción: Número de lotes para abrir una operación.
Tipo de valor: Numérico.
Rango de valores: $0.01-15$ lotes.
Tamaño del paso mínimo: $1$.
tp, sl, vol, conv, info = main.optimization(train)
info
| Take Profit | Stop Loss | Volume | |
|---|---|---|---|
| PSO Train | 133.062 | 147.6956 | 21.3457 |
fig1, fig2, fig3, trainBT, testBT = main.visualOptimization(conv, tp, sl, vol, train, test)
fig1.show()
En esta sección se muestran los resultados visuales del desempeño del sistema de trading con los parámetros óptimos para el periodo de entrenamiento y de prueba.
fig2.show()
main.performance(trainBT, 0.025 / 360)
| metrica | valor | descripcion | |
|---|---|---|---|
| 0 | sharpe_original | 0.177502 | Sharpe Ratio |
| 1 | drawdown_capi | 2019-03-22 22:00:00 | Fecha inicial del DrawDown de Capital |
| 2 | drawdown_capi | 2019-04-25 23:00:00 | Fecha final del DrawDown de Capital |
| 3 | drawdown_capi | -33128.6 | Máxima pérdida flotante registrada |
| 4 | drawup_capi | 2019-11-08 23:00:00 | Fecha inicial del DrawUp de Capital |
| 5 | drawup_capi | 2019-12-13 23:00:00 | Fecha final del DrawUp de Capital |
| 6 | drawup_capi | 35113.7 | Máxima ganancia flotante registrada |
fig3.show()
main.performance(testBT, 0.025 / 360)
| metrica | valor | descripcion | |
|---|---|---|---|
| 0 | sharpe_original | -0.130159 | Sharpe Ratio |
| 1 | drawdown_capi | 2020-03-02 23:00:00 | Fecha inicial del DrawDown de Capital |
| 2 | drawdown_capi | 2020-06-03 23:00:00 | Fecha final del DrawDown de Capital |
| 3 | drawdown_capi | -153369 | Máxima pérdida flotante registrada |
| 4 | drawup_capi | 2020-02-07 23:00:00 | Fecha inicial del DrawUp de Capital |
| 5 | drawup_capi | 2020-03-02 23:00:00 | Fecha final del DrawUp de Capital |
| 6 | drawup_capi | 29030.2 | Máxima ganancia flotante registrada |
El sistema de trading únicamente se desempeña de manera correcta, es decir, que genera rentabilidad, en el conjunto de datos de entrenamiento.
Se logra la optimización del sistema de trading propuesto a través del algoritmo de enjambre de partículas. El sistema de trading muestra un buen desempeño para el conjunto de datos de entrenamiento. Sin embargo, éste no es capaz de generar rentabilidad positiva para el conjunto de datos de prueba; por lo que este es un sistema que necesita replantearse para poder ser implementado en una cuenta con dinero real.